﻿package CutLoad.components
{
	import CutLoad.*;
	import CutLoad.cookies.*;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.GradientType;
	import flash.display.Graphics;
	import flash.display.InterpolationMethod;
	import flash.display.Sprite;
	import flash.geom.Matrix;

	/**
	 * 画面呈现器，显示一此预设效果，显示的方式可以有：拉伸0,平铺1，居中2,垂直重复，水平拉伸3,水平重复，垂直拉伸4
	 * <ul>显示方式的配置说明
	 * <li>0拉伸 无 {}</li>
	 * <li>1平铺 {w:单元格的宽,h:单元格高,spacex:列间距,spacey:行间距}</li>
	 * <li>2居中 无 {}</li>
	 * <li>3垂直重复，水平拉伸{h:单元格高,spacey:行间距}</li>
	 * <li>4水平重复，垂直拉伸{w:单元格的宽,spacex:列间距}</li>
	 * </ul>
	 * <ul>种类配置说明
	 * <li>种类:0. 说明：显示带有色和透明度的方块参数：{color:颜色,alpha:透明度}</li>
	 * <li>种类:1. 说明：显示class参数：{className:类名}</li>
	 * <li>种类:2. 说明：显示图片参数：</li>
	 * <li>种类:3. 说明：显示奇偶行的方框两个参数：{color:颜色,alpha:透明度,color1:颜色,alpha1:透明度}</li>
	 * </ul>
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class CRender extends Base
	{
		//显示的方式
		private var way:uint=0;
		//显示的种类
		private var type:uint=0
		//配置信息
		private var config:Object;
		//
		private var nowW:Number;
		private var nowH:Number;
		//
		private var arrUiBase:Array;
		public function CRender()
		{
		}
		/**
		 * 
		 * @param way 显示方式:拉伸0,平铺1，居中2,垂直重复，水平拉伸3,水平重复，垂直拉伸4
		 * @param type 显示的种类 0,1,2 详见:种类配置说明
		 * @param config 配置信息
		 * @param w 显示的宽度。
		 * @param h 显示的高度。
		 * 
		 * 画面呈现器，显示一此预设效果，显示的方式可以有：拉伸0,平铺1，居中2,垂直重复，水平拉伸3,水平重复，垂直拉伸4
		 * 显示方式的配置说明
		 * 0拉伸 无 {}
		 * 1平铺 {w:单元格的宽,h:单元格高,spacex:列间距,spacey:行间距}
		 * 2居中 无 {}
		 * 3垂直重复，水平拉伸{h:单元格高,spacey:行间距}
		 * 4水平重复，垂直拉伸{w:单元格的宽,spacex:列间距}
		 * 种类配置说明
		 * 种类:0. 说明：显示带有色和透明度的方块参数：{color:颜色,alpha:透明度,isBitmap:是否生成一个Bitmap这样可以提高速度}
		 * 种类:1. 说明：显示className参数：{className:类名}
		 * 种类:2. 说明：显示图片参数：{url:图片地址}
		 * 种类:3. 说明：显示奇偶行的方框两个参数：{color:颜色,alpha:透明度,color1:颜色,alpha1:透明度}
		 * 
		 */		
		public function init(way:uint,type:uint,config:Object,w:Number,h:Number):void{
			//配置信息检测
			arrUiBase=new Array();
			if(way==1||way==3||way==4){
				//平铺
				if(way==1) if(config.spacex==null||config.spacey==null) throw new Error("平铺的方式，需要配置信息里含有以下属性:{spacex:列间距,spacey:行间距}");
				if(way==3) if(config.spacey==null) throw new Error("垂直重复，水平拉伸，需要配置信息里含有以下属性:{spacey:行间距}");
				if(way==4) if(config.spacex==null) throw new Error("水平重复，垂直拉伸，需要配置信息里含有以下属性:{spacex:列间距}");
				//
				var spParent:Sprite=new Sprite();
				arrUiBase.push(spParent);
				this.addChild(spParent)
				var spMask:Sprite=Painter.getRect(w,h,0x000000,0.8)
				arrUiBase.push(spMask);
				this.addChild(spMask)
				//
				spParent.mask=spMask
			}
			//
			this.way=way;
			this.type=type;
			this.config=config;
			if(this.config.w==null) this.config.w=w;
			if(this.config.h==null) this.config.h=h;
			this.nowW=w;
			this.nowH=h;
			//
			this.setWH(w,h);
		}
		private function throwError(str:String):void{
			throw new Error("缺少配置信息属性，请检测格式是否有这些属性:"+str);
		}
		//获得对象
		private function initObj():Base{
			var ubReturn:Base=new Base();
			switch(this.type){
				case 0:
					if(config.color==null||config.alpha==null) throwError("{color:颜色,alpha:透明度}");
					ubReturn=getRtColor()
					break;
				case 1:
					if(config.className==null) throwError("{className:swf地址}");
					ubReturn=getSwf()
					break;
				case 2:
					if(config.url==null) throwError("{url:图片地址}");
					ubReturn=getImg()
					break;
				case 3:
					if(config.color==null||config.alpha==null||config.color1==null||config.alpha1==null) throwError("{color:颜色,alpha:透明度,color1:颜色,alpha1:透明度}");
					ubReturn=get2RowColor()
					break;
				default:
					throw new Error("显示的种类只能取以下值：0,1,2,3,用途详见开发文档。");
					break;
			}
			return ubReturn;
		}
		//显示一个方块
		private function getRtColor():Base{
			var w:Number=this.config.w;
			var h:Number=this.config.h;
			var c:Number=this.config.color;
			var a:Number=this.config.alpha;
			var spTem:Base=new Base();
			var gg:Graphics=spTem.graphics;
			gg.beginFill(c,a);
			gg.drawRect(0,0,w,h);
			gg.endFill();
			//
			if(this.config.isBitmap!=null){
				if(this.config.isBitmap){
					var bd:BitmapData=new BitmapData(w,h,true,0xffffff);
					bd.draw(spTem);
					var img:Bitmap=new Bitmap(bd);
					gg.clear();
					spTem.addChild(img);
				}
			}
			return spTem
		}
		//显示一个奇偶行
		private var is_get2RowColor:Boolean=true;
		private function get2RowColor():Base{
			var w:Number=this.config.w;
			var h:Number=this.config.h;
			var c:Number=this.config.color;
			var a:Number=this.config.alpha;
			var spTem:Base=new Base();
			var gg:Graphics=spTem.graphics;
			if(is_get2RowColor){
				gg.beginFill(c,a);
				gg.drawRect(0,0,w,h);
				gg.endFill();
			}else{
				gg.beginFill(this.config.color1,this.config.alpha1);
				gg.drawRect(0,0,w,h);
				gg.endFill();
			}
			is_get2RowColor=!is_get2RowColor
			//
			return spTem
		}
		//显示一个swf
		private function getSwf():Base{
			var class1:Class=this.config.className
			var temc:Object=new class1();
			var spTem:Base=Base.getBase(temc as DisplayObject);
			return spTem;
		}
		//显示一个图片
		private function getImg():Base{
			var spTem:CLoadImg=new CLoadImg(this.config.url,this.config.w,this.config.h);
			return spTem
		}
		//覆盖---------------------------------------------
		/**
		 * 设置宽，高 
		 * @param w
		 * @param h
		 * 
		 */		
		override public function setWH(w:Number=0, h:Number=0):void{
			if(w==this.nowW&&w==this.nowH) return;
			if(w==0) w=this.nowW;
			if(h==0) h=this.nowH;
			this.nowW=w;
			this.nowH=h;
			//
			switch(way){
				case 0:
					//拉伸0
					if(this.arrUiBase.length==0){
						this.arrUiBase.push(initObj());
						this.addChild(this.arrUiBase[0]);
					}					
					this.arrUiBase[0].setWH(w,h);
					break;
				case 1:
					//平铺1
					//重设mask
					this.arrUiBase[1].width=this.nowW;
					this.arrUiBase[1].height=this.nowH;
					//清除之前的
					/*if(this.arrUiBase.length>2){
						var numCount123:Number=this.arrUiBase.length-2;
						trace("-------------------");
						for(var i:Number=0;i<numCount123;i++){
							this.arrUiBase[0].removeChild(this.arrUiBase.pop());
							trace("清除")
						}
					}*/
					clearSpParent();
					//平铺现在的
					var hang:uint=Math.ceil(this.nowH/(this.config.h+this.config.spacey));
					var lie:uint=Math.ceil(this.nowW/(this.config.w+this.config.spacex));
					//
					for(var k:Number=0;k<lie;k++){
						for(var j:Number=0;j<hang;j++){
							var ubtem345:Base=initObj();
							var xxx:Number=k*(this.config.w+this.config.spacex);
							var yyy:Number=j*(this.config.h+this.config.spacey);
							ubtem345.setXY(xxx,yyy);
							this.arrUiBase[0].addChild(ubtem345)
						}
					}
					break;
				case 2:
					//居中2
					if(this.arrUiBase.length==0){
						this.arrUiBase.push(initObj());
					}else{
						this.removeChild(this.arrUiBase[0]);
						this.arrUiBase[0]=initObj();
					}
					this.addChild(this.arrUiBase[0]);
					//
					var myub:Base=this.arrUiBase[0];
					var xx2:Number=Math.abs(this.nowW-myub.getShowWidth())/2;
					var yy2:Number=Math.abs(this.nowH-myub.getShowHeight())/2;
					myub.setXY(xx2,yy2);
					//
					break;
				case 3:
					//3垂直重复，水平拉伸
					//重设mask
					this.arrUiBase[1].width=this.nowW;
					this.arrUiBase[1].height=this.nowH;
					//清除之前的
					/*if(this.arrUiBase.length>2){
						var numCount1234:Number=this.arrUiBase.length-2;
						for(var m:Number=0;m<numCount1234;m++){
							this.arrUiBase[0].removeChild(this.arrUiBase.pop());
						}
					}*/
					clearSpParent()
					//平铺现在的
					var hang1:uint=Math.ceil(this.nowH/(this.config.h+this.config.spacey));
					//
					for(var ii:Number=0;ii<hang1;ii++){
							var ubtem3451:Base=initObj();
							var yyy1:Number=ii*(this.config.h+this.config.spacey);
							ubtem3451.setXY(0,yyy1);
							ubtem3451.setWH(this.getShowWidth(),this.config.h);
							this.arrUiBase[0].addChild(ubtem3451)
					 }
					break;
				case 4:
					//4水平重复，垂直拉伸
					//重设mask
					this.arrUiBase[1].width=this.nowW;
					this.arrUiBase[1].height=this.nowH;
					//清除之前的
					/*if(this.arrUiBase.length>2){
						var numCount1238:Number=this.arrUiBase.length-2;
						for(var iii:Number=0;iii<numCount1238;iii++){
							this.arrUiBase[0].removeChild(this.arrUiBase.pop());
						}
					}*/
					clearSpParent();
					//平铺现在的
					var lie9:uint=Math.ceil(this.nowW/(this.config.w+this.config.spacex));
					//
					for(var i1:Number=0;i1<lie9;i1++){
						var ubtem34512:Base=initObj();
						var xxx1:Number=i1*(this.config.w+this.config.spacex);
						ubtem34512.setXY(xxx1,0);
						ubtem34512.setWH(this.config.w,300);
						this.arrUiBase[0].addChild(ubtem34512)
					}
					break;
				default:
					throw new Error("显示的方式只有三种：拉伸0,平铺1,居中2,垂直重复，水平拉伸3,水平重复，垂直拉伸4");
					break;
			}
			//是否把显示的图案，
			if(this.config.isBitmap!=null){
				if(this.config.isBitmap){
					this.arrUiBase[0].cacheAsBitmap=true;
				}
			}
		}
		private function clearSpParent():void{
			var spReplace:Sprite=new Sprite();
			this.removeChild(this.arrUiBase[0]);
			this.arrUiBase[0]=spReplace;
			this.addChild(this.arrUiBase[0]);
		}
		override public function getShowWidth():Number{
			return this.nowW;
		}
		override public function getShowHeight():Number{
			return this.nowH;
		}
	}
}